package li.com.ruiji.controller;

import io.swagger.annotations.Api;
import li.com.ruiji.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/common")
@Slf4j
@Api("文件相关操作")
public class CommonController {

    @Value("${ruiji.path}")
    private String filename;
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws IOException {  // 这里参数名必须和前端中name属性名相同
//        file是一个临时文件，需要转存到指定位置，否则本次请求结束后会自动删除
        log.info(file.toString());
//        原始文件名
        String originalFilename = file.getOriginalFilename();
//        '.'以及之后的部分(后缀)
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));

//        给图片命名,用的是随机数
        String name = UUID.randomUUID().toString()+substring;

//        判断文件夹是否存在
        File file1=new File(filename);
        if(!file1.exists()){
//            文件夹不存在,则创建文件夹
            file1.mkdirs();
        }

//        将图片复制到指定位置
        file.transferTo(new File(filename+name));
//        返回这个 name 是为了图片回显时靠名称来找图片
        return R.success(name);
    }

//    上传的图片回显
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
//        构造输入流，获取图片信息
        FileInputStream fileInputStream=new FileInputStream(new File(filename+name));
//        构造输出流，向浏览器发送图片信息
        ServletOutputStream servletOutputStream=response.getOutputStream();
//        设置响应回去的文件格式
        response.setContentType("image/jpeg");
        int len=0;
        byte by[]=new byte[1024];
//        从输入流获取，如果从输入流读到的不为空则向浏览器输出流写
        while((len=fileInputStream.read(by))!=-1){
//            写入输出流 （写入的byte数组，开始下标，写入长度）
            servletOutputStream.write(by,0,len);
//            刷新
            servletOutputStream.flush();
        }
        fileInputStream.close();
        servletOutputStream.close();
    }
}
